package com;

class Animal {
    public void shout() {
        System.out.println("动物叫");
    }
}

class Dog extends Animal {
    @Override
    public void shout() {
        System.out.println("汪汪汪");
    }

    // 特有方法
    public void guard() {
        System.out.println("狗在守卫");
    }
}

class Cat extends Animal {
    @Override
    public void shout() {
        System.out.println("喵喵喵");
    }
}

public class Test {
    public static void main(String[] args) {
        // 向上转型：编译时类型为Animal，运行时类型为Dog
        Animal animal = new Dog();
        animal.shout();  // 汪汪汪（动态绑定）

        // 向下转型的安全示范
        if (animal instanceof Dog) {
            Dog dog = (Dog) animal;
            dog.guard();  // 调用子类特有方法
        }

        // 多态集合遍历
        Animal[] animals = {new Dog(), new Cat(), new Animal()};
        for (Animal a : animals) {
            a.shout();  // 分别输出：汪汪汪、喵喵喵、动物叫
        }

        // 展示变量无多态性
        System.out.println(animal.getClass());  // 输出实际类型 class Dog
    }
}